/**
 * 时间相关常量定义
 * @description 定义时间格式、星期显示文本、默认时间段等常量
 */

/**
 * 时间格式常量
 * @description 定义应用中使用的各种时间格式
 */
export const TIME_FORMATS = {
  /** 日期格式 */
  DATE: {
    /** 标准日期格式 YYYY-MM-DD */
    STANDARD: 'YYYY-MM-DD',
    /** 中文日期格式 YYYY年MM月DD日 */
    CHINESE: 'YYYY年MM月DD日',
    /** 短日期格式 MM/DD */
    SHORT: 'MM/DD',
    /** 月日格式 MM月DD日 */
    MONTH_DAY: 'MM月DD日',
    /** 年月格式 YYYY-MM */
    YEAR_MONTH: 'YYYY-MM',
    /** 年月中文格式 YYYY年MM月 */
    YEAR_MONTH_CHINESE: 'YYYY年MM月',
    /** ISO 日期格式 */
    ISO: 'YYYY-MM-DDTHH:mm:ss.SSSZ',
    /** 文件名安全格式 */
    FILE_SAFE: 'YYYY_MM_DD'
  },
  /** 时间格式 */
  TIME: {
    /** 24小时制 HH:mm */
    HOUR_MINUTE: 'HH:mm',
    /** 24小时制带秒 HH:mm:ss */
    HOUR_MINUTE_SECOND: 'HH:mm:ss',
    /** 12小时制 hh:mm A */
    HOUR_MINUTE_AMPM: 'hh:mm A',
    /** 12小时制带秒 hh:mm:ss A */
    HOUR_MINUTE_SECOND_AMPM: 'hh:mm:ss A'
  },
  /** 日期时间格式 */
  DATETIME: {
    /** 标准格式 YYYY-MM-DD HH:mm */
    STANDARD: 'YYYY-MM-DD HH:mm',
    /** 完整格式 YYYY-MM-DD HH:mm:ss */
    FULL: 'YYYY-MM-DD HH:mm:ss',
    /** 中文格式 YYYY年MM月DD日 HH:mm */
    CHINESE: 'YYYY年MM月DD日 HH:mm',
    /** 友好格式 MM月DD日 HH:mm */
    FRIENDLY: 'MM月DD日 HH:mm',
    /** 紧凑格式 YYYYMMDD_HHmmss */
    COMPACT: 'YYYYMMDD_HHmmss'
  },
  /** 相对时间格式 */
  RELATIVE: {
    /** 刚刚 */
    JUST_NOW: '刚刚',
    /** 分钟前 */
    MINUTES_AGO: '{0}分钟前',
    /** 小时前 */
    HOURS_AGO: '{0}小时前',
    /** 天前 */
    DAYS_AGO: '{0}天前',
    /** 周前 */
    WEEKS_AGO: '{0}周前',
    /** 月前 */
    MONTHS_AGO: '{0}个月前',
    /** 年前 */
    YEARS_AGO: '{0}年前'
  }
} as const;

/**
 * 星期显示文本常量
 * @description 定义星期的各种显示格式
 */
export const WEEKDAY_TEXTS = {
  /** 完整星期名称 */
  FULL: {
    1: '星期一',
    2: '星期二',
    3: '星期三',
    4: '星期四',
    5: '星期五',
    6: '星期六',
    7: '星期日'
  },
  /** 简短星期名称 */
  SHORT: {
    1: '周一',
    2: '周二',
    3: '周三',
    4: '周四',
    5: '周五',
    6: '周六',
    7: '周日'
  },
  /** 单字符星期名称 */
  SINGLE: {
    1: '一',
    2: '二',
    3: '三',
    4: '四',
    5: '五',
    6: '六',
    7: '日'
  },
  /** 英文星期名称 */
  ENGLISH: {
    1: 'Monday',
    2: 'Tuesday',
    3: 'Wednesday',
    4: 'Thursday',
    5: 'Friday',
    6: 'Saturday',
    7: 'Sunday'
  },
  /** 英文简写星期名称 */
  ENGLISH_SHORT: {
    1: 'Mon',
    2: 'Tue',
    3: 'Wed',
    4: 'Thu',
    5: 'Fri',
    6: 'Sat',
    7: 'Sun'
  }
} as const;

/**
 * 月份显示文本常量
 * @description 定义月份的各种显示格式
 */
export const MONTH_TEXTS = {
  /** 中文月份名称 */
  CHINESE: {
    1: '一月', 2: '二月', 3: '三月', 4: '四月',
    5: '五月', 6: '六月', 7: '七月', 8: '八月',
    9: '九月', 10: '十月', 11: '十一月', 12: '十二月'
  },
  /** 简短中文月份名称 */
  CHINESE_SHORT: {
    1: '1月', 2: '2月', 3: '3月', 4: '4月',
    5: '5月', 6: '6月', 7: '7月', 8: '8月',
    9: '9月', 10: '10月', 11: '11月', 12: '12月'
  },
  /** 英文月份名称 */
  ENGLISH: {
    1: 'January', 2: 'February', 3: 'March', 4: 'April',
    5: 'May', 6: 'June', 7: 'July', 8: 'August',
    9: 'September', 10: 'October', 11: 'November', 12: 'December'
  },
  /** 英文简写月份名称 */
  ENGLISH_SHORT: {
    1: 'Jan', 2: 'Feb', 3: 'Mar', 4: 'Apr',
    5: 'May', 6: 'Jun', 7: 'Jul', 8: 'Aug',
    9: 'Sep', 10: 'Oct', 11: 'Nov', 12: 'Dec'
  }
} as const;

/**
 * 默认时间段常量
 * @description 定义常用的时间段配置
 */
export const DEFAULT_TIME_SLOTS = {
  /** 上午时间段 */
  MORNING: [
    { start: '08:00', end: '08:45', label: '第1节' },
    { start: '08:55', end: '09:40', label: '第2节' },
    { start: '10:00', end: '10:45', label: '第3节' },
    { start: '10:55', end: '11:40', label: '第4节' }
  ],
  /** 下午时间段 */
  AFTERNOON: [
    { start: '14:00', end: '14:45', label: '第5节' },
    { start: '14:55', end: '15:40', label: '第6节' },
    { start: '16:00', end: '16:45', label: '第7节' },
    { start: '16:55', end: '17:40', label: '第8节' }
  ],
  /** 晚上时间段 */
  EVENING: [
    { start: '19:00', end: '19:45', label: '第9节' },
    { start: '19:55', end: '20:40', label: '第10节' },
    { start: '20:50', end: '21:35', label: '第11节' }
  ],
  /** 自定义时间段模板 */
  CUSTOM_TEMPLATES: [
    { start: '09:00', end: '10:00', label: '1小时课程' },
    { start: '09:00', end: '10:30', label: '1.5小时课程' },
    { start: '09:00', end: '11:00', label: '2小时课程' },
    { start: '14:00', end: '15:30', label: '下午1.5小时' },
    { start: '19:00', end: '21:00', label: '晚上2小时' }
  ]
} as const;

/**
 * 课程时长常量
 * @description 定义标准的课程时长选项（分钟）
 */
export const COURSE_DURATIONS = {
  /** 30分钟 */
  THIRTY_MINUTES: 30,
  /** 45分钟 */
  FORTY_FIVE_MINUTES: 45,
  /** 1小时 */
  ONE_HOUR: 60,
  /** 1.5小时 */
  ONE_HOUR_THIRTY: 90,
  /** 2小时 */
  TWO_HOURS: 120,
  /** 2.5小时 */
  TWO_HOURS_THIRTY: 150,
  /** 3小时 */
  THREE_HOURS: 180,
  /** 常用时长选项 */
  COMMON_OPTIONS: [30, 45, 60, 90, 120, 150, 180],
  /** 默认时长 */
  DEFAULT: 60
} as const;

/**
 * 时间间隔常量
 * @description 定义各种时间间隔（毫秒）
 */
export const TIME_INTERVALS = {
  /** 1秒 */
  ONE_SECOND: 1000,
  /** 5秒 */
  FIVE_SECONDS: 5 * 1000,
  /** 10秒 */
  TEN_SECONDS: 10 * 1000,
  /** 30秒 */
  THIRTY_SECONDS: 30 * 1000,
  /** 1分钟 */
  ONE_MINUTE: 60 * 1000,
  /** 5分钟 */
  FIVE_MINUTES: 5 * 60 * 1000,
  /** 10分钟 */
  TEN_MINUTES: 10 * 60 * 1000,
  /** 15分钟 */
  FIFTEEN_MINUTES: 15 * 60 * 1000,
  /** 30分钟 */
  THIRTY_MINUTES: 30 * 60 * 1000,
  /** 1小时 */
  ONE_HOUR: 60 * 60 * 1000,
  /** 1天 */
  ONE_DAY: 24 * 60 * 60 * 1000,
  /** 1周 */
  ONE_WEEK: 7 * 24 * 60 * 60 * 1000,
  /** 1个月（30天） */
  ONE_MONTH: 30 * 24 * 60 * 60 * 1000,
  /** 1年（365天） */
  ONE_YEAR: 365 * 24 * 60 * 60 * 1000
} as const;

/**
 * 工作时间常量
 * @description 定义标准的工作时间配置
 */
export const WORKING_HOURS = {
  /** 工作日 */
  WEEKDAYS: [1, 2, 3, 4, 5], // 周一到周五
  /** 周末 */
  WEEKENDS: [6, 7], // 周六和周日
  /** 默认工作时间 */
  DEFAULT: {
    /** 开始时间 */
    START: '08:00',
    /** 结束时间 */
    END: '18:00',
    /** 午休开始时间 */
    LUNCH_START: '12:00',
    /** 午休结束时间 */
    LUNCH_END: '13:00'
  },
  /** 学校时间 */
  SCHOOL: {
    /** 开始时间 */
    START: '08:00',
    /** 结束时间 */
    END: '17:30',
    /** 午休开始时间 */
    LUNCH_START: '11:40',
    /** 午休结束时间 */
    LUNCH_END: '14:00'
  },
  /** 培训机构时间 */
  TRAINING: {
    /** 开始时间 */
    START: '09:00',
    /** 结束时间 */
    END: '21:00',
    /** 午休开始时间 */
    LUNCH_START: '12:00',
    /** 午休结束时间 */
    LUNCH_END: '14:00'
  }
} as const;

/**
 * 时区常量
 * @description 定义时区相关的常量
 */
export const TIMEZONE = {
  /** 中国标准时间 */
  CHINA: 'Asia/Shanghai',
  /** UTC 时间 */
  UTC: 'UTC',
  /** 本地时区 */
  LOCAL: Intl.DateTimeFormat().resolvedOptions().timeZone,
  /** 时区偏移量（小时） */
  CHINA_OFFSET: 8,
  /** 时区偏移量（毫秒） */
  CHINA_OFFSET_MS: 8 * 60 * 60 * 1000
} as const;

/**
 * 日期范围常量
 * @description 定义常用的日期范围
 */
export const DATE_RANGES = {
  /** 今天 */
  TODAY: 'today',
  /** 昨天 */
  YESTERDAY: 'yesterday',
  /** 明天 */
  TOMORROW: 'tomorrow',
  /** 本周 */
  THIS_WEEK: 'this_week',
  /** 上周 */
  LAST_WEEK: 'last_week',
  /** 下周 */
  NEXT_WEEK: 'next_week',
  /** 本月 */
  THIS_MONTH: 'this_month',
  /** 上月 */
  LAST_MONTH: 'last_month',
  /** 下月 */
  NEXT_MONTH: 'next_month',
  /** 本季度 */
  THIS_QUARTER: 'this_quarter',
  /** 本年 */
  THIS_YEAR: 'this_year',
  /** 最近7天 */
  LAST_7_DAYS: 'last_7_days',
  /** 最近30天 */
  LAST_30_DAYS: 'last_30_days',
  /** 最近90天 */
  LAST_90_DAYS: 'last_90_days'
} as const;

/**
 * 日期范围显示文本
 * @description 定义日期范围的显示文本
 */
export const DATE_RANGE_TEXTS = {
  [DATE_RANGES.TODAY]: '今天',
  [DATE_RANGES.YESTERDAY]: '昨天',
  [DATE_RANGES.TOMORROW]: '明天',
  [DATE_RANGES.THIS_WEEK]: '本周',
  [DATE_RANGES.LAST_WEEK]: '上周',
  [DATE_RANGES.NEXT_WEEK]: '下周',
  [DATE_RANGES.THIS_MONTH]: '本月',
  [DATE_RANGES.LAST_MONTH]: '上月',
  [DATE_RANGES.NEXT_MONTH]: '下月',
  [DATE_RANGES.THIS_QUARTER]: '本季度',
  [DATE_RANGES.THIS_YEAR]: '本年',
  [DATE_RANGES.LAST_7_DAYS]: '最近7天',
  [DATE_RANGES.LAST_30_DAYS]: '最近30天',
  [DATE_RANGES.LAST_90_DAYS]: '最近90天'
} as const;

/**
 * 课表视图时间配置
 * @description 定义课表视图的时间相关配置
 */
export const SCHEDULE_VIEW_CONFIG = {
  /** 日视图配置 */
  DAY_VIEW: {
    /** 显示的时间范围 */
    TIME_RANGE: {
      START: '07:00',
      END: '22:00'
    },
    /** 时间间隔（分钟） */
    TIME_INTERVAL: 30,
    /** 最小时间单位（分钟） */
    MIN_TIME_UNIT: 15
  },
  /** 周视图配置 */
  WEEK_VIEW: {
    /** 显示的时间范围 */
    TIME_RANGE: {
      START: '08:00',
      END: '21:00'
    },
    /** 时间间隔（分钟） */
    TIME_INTERVAL: 60,
    /** 是否显示周末 */
    SHOW_WEEKEND: true,
    /** 一周开始于周几（1=周一，7=周日） */
    WEEK_START: 1
  },
  /** 月视图配置 */
  MONTH_VIEW: {
    /** 是否显示相邻月份的日期 */
    SHOW_ADJACENT_MONTHS: true,
    /** 是否显示周数 */
    SHOW_WEEK_NUMBERS: false,
    /** 一周开始于周几 */
    WEEK_START: 1
  }
} as const;

/**
 * 提醒时间选项常量
 * @description 定义课程提醒的时间选项（分钟）
 */
export const REMINDER_TIME_OPTIONS = [
  { value: 0, label: '准时提醒' },
  { value: 5, label: '提前5分钟' },
  { value: 10, label: '提前10分钟' },
  { value: 15, label: '提前15分钟' },
  { value: 30, label: '提前30分钟' },
  { value: 60, label: '提前1小时' },
  { value: 120, label: '提前2小时' },
  { value: 1440, label: '提前1天' }
] as const;

/**
 * 时间验证常量
 * @description 定义时间验证相关的常量
 */
export const TIME_VALIDATION = {
  /** 最小课程时长（分钟） */
  MIN_COURSE_DURATION: 15,
  /** 最大课程时长（分钟） */
  MAX_COURSE_DURATION: 480, // 8小时
  /** 最小课程间隔（分钟） */
  MIN_COURSE_INTERVAL: 5,
  /** 最大提前预约天数 */
  MAX_ADVANCE_BOOKING_DAYS: 365,
  /** 最小提前预约小时数 */
  MIN_ADVANCE_BOOKING_HOURS: 1,
  /** 最大课程实例生成数量 */
  MAX_INSTANCE_GENERATION: 1000
} as const;